package com.wdemo.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wdemo.mapper.ChatSessionMapper;
import com.wdemo.pojo.domain.ChatSession;
import com.wdemo.pojo.vo.SessionVO;
import com.wdemo.service.ChatSessionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @ClassName ChatSessionServiceImpl
 * @Description 会话服务实现类
 * @Author WDEMO
 * @Date 2025/8/22 19:07
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class ChatSessionServiceImpl extends ServiceImpl<ChatSessionMapper, ChatSession> implements ChatSessionService {

//    private final SessionProperties sessionProperties;

    private final ChatMemory chatMemory;



    @Override
    public SessionVO createSession(String type) {
//        SessionVO sessionVO = BeanUtil.toBean(sessionProperties, SessionVO.class);
        // 随机选择num个示例
//        List<SessionVO.Example> examples = RandomUtil.randomEleList(sessionVO.getExamples(), num);
//
//        sessionVO.setExamples(examples);
        SessionVO sessionVO = new SessionVO();

        ChatSession one = lambdaQuery()
                .eq(ChatSession::getUserId, 1L)
                .eq(ChatSession::getType,type)
                .orderByDesc(ChatSession::getCreateTime)
                .last("limit 1")
                .one();
        if (ObjectUtil.isNotNull(one) && one.getTitle() == null){
            sessionVO.setSessionId(one.getSessionId());
        }else {
            // 生成随机的sessionId
            sessionVO.setSessionId(IdUtil.fastSimpleUUID());

            ChatSession chatSession = ChatSession.builder()
                    .sessionId(sessionVO.getSessionId())
                    .type(type)
                    //todo 从线程上下文获取用户id
                    .userId(1L)
                    .creater(1L)
                    .updater(1L)
                    .build();
            this.baseMapper.insert(chatSession);
        }




        return sessionVO;
    }

    /**
     * 获取热门会话
     *
     * @return 热门会话列表
     */
//    @Override
//    public List<SessionVO.Example> hotExamples(Integer num) {
//        return RandomUtil.randomEleList(sessionProperties.getExamples(), num);
//    }

//    @Override
//    public List<MessageVO> queryBySessionId(String sessionId) {
//        String conversationId = ChatService.getConversationId(sessionId);
//        List<Message> messages = chatMemory.get(conversationId);
//        if (CollectionUtil.isEmpty(messages)){
//            return List.of();
//        }
//        List<MessageVO> messageVOList = messages.stream()
//                .filter(message -> message.getMessageType() == MessageType.USER || message.getMessageType() == MessageType.ASSISTANT)
//                .map(message -> {
//                    MessageVO messageVO = MessageVO.builder()
//                            .type(MessageTypeEnum.valueOf(message.getMessageType().name()))
//                            .content(message.getText())
//                            .build();
//                    if (message instanceof MyAssistantMessage assistantMessage) {
//                        messageVO.setParams(assistantMessage.getParams());
//                    }
//                    return messageVO;
//                })
//                .collect(Collectors.toList());
//        return messageVOList;
//    }

    @Async
    @Override
    public void update(String sessionId, String title, Long userId) {

        List<ChatSession> chatSessions = lambdaQuery()
                .eq(ChatSession::getSessionId, sessionId)
                .eq(ChatSession::getUserId, userId)
                .orderByDesc(ChatSession::getUpdateTime)
                .list();

        // 如果列表为空，直接返回，无需进一步处理
        if (CollUtil.isEmpty(chatSessions)) {
            return;
        }
        ChatSession one = chatSessions.get(0);

        if (ObjectUtil.isNull(one.getTitle()) && ObjectUtil.isNotNull(title)){
            one.setTitle(StrUtil.sub(title, 0, 100));
        }
        // 设置更新字段为updateTime为当前时间
        one.setUpdateTime(LocalDateTimeUtil.now());
        this.baseMapper.updateById(one);
    }
//
//    @Override
//    public Map<String, List<ChatSessionVO>> queryHistory() {
//        List<ChatSession> chatSessions = lambdaQuery()
//                .eq(ChatSession::getUserId, 1L)
//                .orderByDesc(ChatSession::getUpdateTime)
//                .last("limit 30")
//                .list();
//        if (CollUtil.isEmpty(chatSessions)) {
//            log.info("No chat sessions found for user: {}", 1l);
//            return Map.of();
//        }
//        List<ChatSessionVO> chatSessionVOs= BeanUtil.copyToList(chatSessions, ChatSessionVO.class);
//
//        final String TODAY = "当天";
//        final String LAST_30_DAYS = "最近30天";
//        final String LAST_YEAR = "最近1年";
//        final String MORE_THAN_YEAR = "1年以上";
//
//        LocalDate now = LocalDate.now();
//        // 优化后的代码：按时间分组并转换为Map
//        Map<String, List<ChatSessionVO>> result = chatSessionVOs.stream()
//                .collect(Collectors.groupingBy(chatSessionVO -> {
//                    LocalDate updateTime = chatSessionVO.getUpdateTime().toLocalDate();
//                    long between = ChronoUnit.DAYS.between(updateTime, now);
//
//                    if (between == 0) {
//                        return TODAY;
//                    } else if (between <= 30) {
//                        return LAST_30_DAYS;
//                    } else if (between <= 365) {
//                        return LAST_YEAR;
//                    } else {
//                        return MORE_THAN_YEAR;
//                    }
//                }));
//        return result;
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void delHistory(String sessionId) {
//        boolean remove = lambdaUpdate()
//                .eq(ChatSession::getSessionId, sessionId)
//                .eq(ChatSession::getUserId, 1L)
//                .remove();
//        if (!remove){
//            throw new RuntimeException("删除失败");
//        }
//
//        String conversationId = ChatService.getConversationId(sessionId);
//        chatMemory.clear(conversationId);
//    }
//
//    @Override
//    public void updateHistoryTitle(String sessionId, String title) {
//        boolean update = lambdaUpdate()
//                .eq(ChatSession::getSessionId, sessionId)
//                .eq(ChatSession::getUserId, 1L)
//                // 设置更新条件, 更新字段为title(最多设置前100个字符)，更新条件为sessionId和userId
//                .set(ChatSession::getTitle, StrUtil.sub(title, 0, 100))
//                .update();
//        if (!update){
//            throw new RuntimeException("更新失败");
//        }
//    }
}
